import grails.test.*

class ClienteTests extends GrailsUnitTestCase {
    protected void setUp() {
        super.setUp()
        mockDomain(Cliente)
        mockDomain(TipoCliente)
        mockDomain(EstadoCliente)
        Cliente.list()*.delete()
        def estadosCliente = ['Interesado', 'Descartado', 'Finalizado', 'Pendiente por facturacion']
        estadosCliente.each{ new EstadoCliente(nombre:it).save() }

        def tiposCliente = ['Bar', 'Restaurante', 'Panaderia', 'Peluqueria', 'Minimercado']
        tiposCliente.each{ new TipoCliente(nombre:it).save() }
    }

    protected void tearDown() {
        super.tearDown()
    }

    public Cliente createClienteOK(){
        Cliente c =  new Cliente(
                nombreEstablecimiento:'Exito',
                nit:'900.128.452-1',
                telefono:'3216584',
                contactoNombres:'Ricardo',
                contactoApellidos:'Yepes',
                contactoTelefono:'441 45-48',
                contactoTelefonoMovil:'300 2585441',
                tipoCliente:TipoCliente.get(1), //Por ejemplo Minimercado, Bar, Restautante..
                estadoCliente:EstadoCliente.get(1),
                direccionCampo1:'Calle',
                direccionCampo2:'87',
                direccionCampo3:'A',
                direccionCampo4:'Sur',
                direccionCampo5:'62',
                direccionCampo6:'AB',
                direccionCampo7:'Norte',
                direccionCampo8:'130',
                direccionCampo9:'Urbanizacion Piemonte, Casa 104',
                correoElectronico:'exito@exito.com',
                observaciones:'')
        return c
    }

    void testOK(){
        Cliente c = createClienteOK()
        assert c.nombreEstablecimiento =='Exito'
        assert c.nit == '900.128.452-1'
        assert c.telefono == '3216584'
        assert c.contactoNombres == 'Ricardo'
        assert c.contactoApellidos == 'Yepes'
        assert c.contactoTelefono == '441 45-48'
        assert c.contactoTelefonoMovil == '300 2585441'
        assert c.tipoCliente == TipoCliente.get(1) //Por ejemplo Minimercado Bar Restautante..
        assert c.estadoCliente == EstadoCliente.get(1)
        assert c.direccionCampo1 == 'Calle'
        assert c.direccionCampo2 == 87
        assert c.direccionCampo3 == 'A'
        assert c.direccionCampo4 == 'Sur'
        assert c.direccionCampo5 ==  62
        assert c.direccionCampo6 == 'AB'
        assert c.direccionCampo7 == 'Norte'
        assert c.direccionCampo8 == 130
        assert c.direccionCampo9 == 'Urbanizacion Piemonte, Casa 104'
        assert c.correoElectronico == 'exito@exito.com'
        assert c.observaciones == ''
        c.validate()
        println c.errors
        assertTrue('Objeto no valido', c.validate())
    }

    void testPersist(){
        Cliente c = createClienteOK()
        c.save()
        assertEquals('El cliente no se guardo en la base de datos', Cliente.count(), 1)
        Cliente x = new Cliente()
        x.save()
        assertEquals('Un cliente no valido se guardo en la base de datos', Cliente.count(), 1)
        assertEquals('El vendedor no se recupero correctamente de la base de datos', Cliente.get(1).nit, '900.128.452-1')
    }

    void testNombreEstablecimiento() {
        Cliente c = createClienteOK()
        c.nombreEstablecimiento = ''
        assertFalse('nombreEstablecimiento no puede estar en blanco', c.validate())
        c.nombreEstablecimiento = 'Carrefour'
        c.save()
        Cliente c2 = createClienteOK()
        c2.nombreEstablecimiento = 'Carrefour'
        assertFalse('El nombreEstablecimiento debe ser unico', c2.validate())
    }

    void testNit(){
        Cliente c = createClienteOK()
        c.nit = ''
        assertTrue('nit si puede estar en blanco', c.validate())
        def nitsValidos = ['900.128.452-1', '900 128 452 1', '900128452-1', '900 128 452-1']
        def nitsInvalidos = ['900.128.452-10', '90..128.452-1', '90.128.452-1', '.90.128.452-1']
        nitsValidos.each{
            c.nit = it
            assertTrue('este nit deberia ser valido', c.validate())
        }
        nitsInvalidos.each{
            c.nit = it
            assertFalse('este nit no deberia ser valido', c.validate())
        }
    }

    void testTelefono(){
        Cliente c = createClienteOK()
        c.telefono = ''
        assertFalse('telefono no puede estar en blanco', c.validate())
        c.telefono = '309-27-13'
        assertTrue('telefono correcto', c.validate())
        c.telefono = '309 27 13'
        assertTrue('telefono correcto', c.validate())
        c.telefono = '3092713'
        assertTrue('telefono correcto', c.validate())
        c.telefono = '309 27 1'
        assertFalse('telefono sin suficientes numeros', c.validate())
        c.telefono = ' 3092713'
        assertFalse('telefono con espacio al principio', c.validate())
    }

    void testContactoNombres(){
        Cliente c = createClienteOK()
        c.contactoNombres = ''
        assertFalse('contactoNombres es obligatorio', c.validate())
    }

    void testContactoApellidos(){
        Cliente c = createClienteOK()
        c.contactoApellidos = ''
        assertFalse('contactoApellidos es obligatorio', c.validate())
    }

    void testContactoTelefono(){
        Cliente c = createClienteOK()

        c.contactoTelefono = ''
        assertTrue('contactoTelefono no es obligatorio', c.validate())

        def telsValidos = ['309-27-13', '309 27 13', '3092713']
        telsValidos.each{
            c.contactoTelefono = it
            assertTrue('telefono valido', c.validate())
        }

        c.contactoTelefono = '309 27 1'
        assertFalse('telefono sin suficientes numeros', c.validate())
        c.contactoTelefono = ' 3092713'
        assertFalse('telefono con espacio al principio', c.validate())
    }

    void testContactoTelefonoMovil(){
        Cliente c = createClienteOK()
        c.contactoTelefonoMovil = ''
        assertTrue('contactoTelefonoMovil no es obligatorio', c.validate())

        c.contactoTelefonoMovil = '300-309-27-13'
        assertTrue('contactoTelefonoMovil correcto', c.validate())
        c.contactoTelefonoMovil = '300 309 27 13'
        assertTrue('contactoTelefonoMovil correcto', c.validate())
        c.contactoTelefonoMovil = '3003092713'
        assertTrue('contactoTelefonoMovil correcto', c.validate())
        c.contactoTelefonoMovil = '300 309 27 1'
        assertFalse('contactoTelefonoMovil sin suficientes numeros', c.validate())
        c.contactoTelefonoMovil = ' 3003092713'
        assertFalse('contactoTelefonoMovil con espacio al principio', c.validate())
    }


    void testDireccionCampo1(){
        Cliente c = createClienteOK()
        c.direccionCampo1 = ''
        assertFalse('campo obligatorio', c.validate())
    }

    void testDireccionCampo2(){
        Cliente c = createClienteOK()
        c.direccionCampo2 = null
        assertFalse('campo obligatorio', c.validate())
    }

    void testDireccionCampo3(){
        Cliente c = createClienteOK()
        c.direccionCampo3 = ''
        assertTrue('campo no obligatorio', c.validate())
    }

    void testDireccionCampo4(){
        Cliente c = createClienteOK()
        c.direccionCampo4 = ''
        assertTrue('campo no obligatorio', c.validate())
    }

    void testDireccionCampo5(){
        Cliente c = createClienteOK()
        c.direccionCampo5 = null
        assertFalse('campo obligatorio', c.validate())
    }

    void testDireccionCampo6(){
        Cliente c = createClienteOK()
        c.direccionCampo6 = ''
        assertTrue('campo no obligatorio', c.validate())
    }

    void testDireccionCampo7(){
        Cliente c = createClienteOK()
        c.direccionCampo7 = ''
        assertTrue('campo no obligatorio', c.validate())
    }

    void testDireccionCampo8(){
        Cliente c = createClienteOK()
        c.direccionCampo8 = null
        assertFalse('campo obligatorio', c.validate())
    }

    void testDireccionCampo9(){
        Cliente c = createClienteOK()
        c.direccionCampo9 = ''
        assertTrue('campo no obligatorio', c.validate())
    }

    void testTipoCliente(){
        Cliente c = createClienteOK()
        c.tipoCliente = null
        assertFalse('campo obligatorio', c.validate())
    }

    void testEstadoCliente(){
        Cliente c = createClienteOK()
        c.estadoCliente = null
        assertFalse('campo obligatorio', c.validate())
    }

    void testCorreoElectronico(){
        Cliente c = createClienteOK()
        c.correoElectronico = ''
        assertFalse('El correoElectronico no puede estar en blanco', c.validate())
        c.correoElectronico = 'rik@matrix.net'
        assertTrue('correoElectronico correcto', c.validate())
        c.correoElectronico = 'rik@.net'
        assertFalse('Sin dominio', c.validate())
        c.correoElectronico = 'rik@matrixnet'
        assertFalse('Falta el punto', c.validate())
        c.correoElectronico = 'rikmatrix.net'
        assertFalse('Falta @', c.validate())
        c.correoElectronico = 'rik@@matrix.net'
        assertFalse('Numero de @ incorrecto', c.validate())
    }

    void testObservaciones(){
        Cliente c = createClienteOK()
        c.observaciones = ''
        assertTrue('campo no obligatorio', c.validate())
    }

    void testToString(){
        Cliente c = createClienteOK()
        assertEquals(c.nombreEstablecimiento, c.toString())
    }

}
